/*********************************************************
 * 初学之家(http://www.g2room.com)，提供Java、Javascript（js）、Jquery、
 * 等一些工具或常用功能的实现例子代码，希望能给初学者提供学习和工作上的帮助，
 * 也希望有想提供源代码的朋友能联系我，一起努力，提供更多、更全面、更详细的
 * 一些初学代码例子及经验，帮助更多的人。
 * 
 * 我的联系方式：E-Mail：g2room@163.com
 * 网址：http://www.g2room.com
 * QQ：天涯（1173930590）
 * QQ交流群：323642758
 * 
 * 本站内容为提供各种java、javascript(JS)常用的工具源代码、实例（示例）、
 * 基本配置、教程、手册等；目前Java代码提供的工具（或转换）例子代码如下：
 * BASE64转换工具、bytes相关操作、email收发、文件操作（读写、拷贝、遍历、
 * 多线程copy等）、json格式转换、日志（Log4j）操作工具、Lucene搜索引擎的
 * 创建索引和搜索、各种不同Map的使用、定时器（Quartz）的使用例子、Socket的
 * 连接传输数据例子、WebService的例子及一些常用的工具类如String、Date及
 * JDK自带的一些工具类及函数的使用例子。
 * 
 * 说明：如需直接使用本站的例子代码，请保留此说明
 * 
 ********************************************************/
package com.g2room.driving.util;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * Base64转换工具类，也可作为加密工具使用<br>
 * 包括字符串转换为Base64编码，Base64编码转换为字符串。<br>
 * 图片转换为base64编码，base64转换为图片并输出保存。
 *
 * @createTime: Jun 19, 2013 11:59:21 AM
 * @author: <a href="mailto:g2room@163.com">天涯</a>
 * @version: 0.1
 * @lastVersion: 0.1
 * @updateTime: 
 * @updateAuthor: <a href="mailto:g2room@163.com">天涯</a>
 * @changesSum: 
 * 
 */
public class Base64Util {

	/**
	 * 
	 * 将指定字符串进行base64编码
	 * 
	 * @param {String} str 需要进行base64编码的字符串
	 * @return {String} base64编码后的字符串
	 *
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 12:01:22 PM
	 */
	public static String encode(String str) {
		String sr = null;
		if (null != str) {
			sr = (new BASE64Encoder()).encode(str.getBytes());
		}
		return sr;
	}

	/**
	 * 
	 * 对传入的字符串进行base64解码
	 * 
	 * @param {String} str 需要解码的字符串
	 * @return {String} 解码后的字符串
	 *
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 12:02:00 PM
	 */
	public static String decode(String str) {
		String rs = null;
		if (null != str) {
			BASE64Decoder decoder = new BASE64Decoder();
			try {
				rs = new String(decoder.decodeBuffer(str));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return rs;
	}
	
	/**
	 * 图片文件转换字节数组，再为BASE64编码字符串
	 *
	 * @param {String} imgFilePath 图片路径
	 * @return {String} 转换后的图片内容，为Base64编码
	 * 
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 12:02:18 PM
	 */
	public static String getImgBase64Str(String imgFilePath) {
		InputStream in = null;
		byte[] data = null;
		// 读取图片字节数组
		try {
			in = new FileInputStream(imgFilePath);
			data = new byte[in.available()];
			in.read(data);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(null != in) in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		// 对字节数组Base64编码
		BASE64Encoder encoder = new BASE64Encoder();
		// 返回Base64编码过的字节数组字符串
		return encoder.encode(data);
	}

	/**
	 * 对字节数组字符串进行Base64解码并生成图片
	 *
	 * @param {String} imgData 图片数据字符串，为Base64编码
	 * @param {String} imgFilePath 图片路径
	 * @return {Boolean} 成功则返回true，失败则返回false
	 * 
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 19, 2013 12:03:50 PM
	 */
	public static boolean getImgByBase64Str(String imgData, String imgFilePath) {
		if (imgData == null) return false;
		boolean rs = false;
		OutputStream out = null;
		BASE64Decoder decoder = new BASE64Decoder();
		try {
			// Base64解码
			byte[] b = decoder.decodeBuffer(imgData);
			for (int i = 0; i < b.length; ++i) {
				if (b[i] < 0) {
					// 调整异常数据
					b[i] += 256;
				}
			}
			// 生成jpeg图片
			out = new FileOutputStream(imgFilePath);
			out.write(b);
			out.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(out != null) {
					out.close();
					rs = true;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return rs;
	}

	public static void main(String[] str) {
//		String imgFile = "d:/test/test.jpg";
//		String strImg = GetImageStr(imgFile);
//		System.out.println("转换后（Base64）为："+strImg);
//		GenerateImage(strImg, "d:/test/test1.jpg");
        
		String name = "初学之家(http://www.g2room.com)，提供Java、Javascript（js）、Jquery、等一些工具或常用功能的实现例子代码，希望能给初学者提供学习和工作上的帮助， * 也希望有想提供源代码的朋友能联系我，一起努力，提供更多、更全面、更详细的 * 一些初学代码例子及经验，帮助更多的人。";
		String en = "d3d3LmJhc2h1LmNvbS5jbg==";
//		String en = Base64Util.encode(name);
//		System.out.println("转换后（Base64）为："+en);
		String de = Base64Util.decode(en);
		System.out.println("还原（Base64）后为"+de);
	}

}
